filename = 'raw_results_20241022_142417.csv';
data_file = fullfile('..', 'results', 'logs', filename); % 使用 fullfile 生成路径
filename_without_extension = erase(filename, '.csv'); % 移除文件扩展名
save_dir = fullfile('..', 'results', 'imgs', filename_without_extension);

% 创建保存目录（如果不存在）
if ~exist(save_dir, 'dir')
    mkdir(save_dir);
end

% 调用平滑数据的函数，并正确接收返回值
[Zq_z1_smooth, Zq_z2_smooth, Xq, Yq] = smooth_data(data_file);

% 绘制平滑后的 z_1 与 (x, y) 的关系图
figure;
surf(Xq, Yq, Zq_z1_smooth);
title('Smoothed Error (z_1) versus (Node, K)');
xlabel('Node (x)');
ylabel('K (y)');
zlabel('Smoothed Error (z_1)');
colorbar;

% 保存图像到指定目录
saveas(gcf, fullfile(save_dir, 'error.fig'));

% 绘制平滑后的 z_2 与 (x, y) 的关系图
figure;
surf(Xq, Yq, Zq_z2_smooth);
title('Smoothed Rounds (z_2) versus (Node, K)');
xlabel('Node (x)');
ylabel('K (y)');
zlabel('Smoothed Rounds (z_2)');
colorbar;

% 保存图像到指定目录
saveas(gcf, fullfile(save_dir, 'round.fig'));

function [Zq_z1_smooth, Zq_z2_smooth, Xq, Yq] = smooth_data(filename)
    % 读取数据
    data = readtable(filename);
    
    % 提取列数据
    x = data.Node; % Node 对应 x
    y = data.K;    % K 对应 y
    z_1 = data.Error; % Error 对应 z_1
    z_2 = data.Rounds; % Rounds 对应 z_2
    
    % 创建网格
    Xq = linspace(min(x), max(x), 100);
    Yq = linspace(min(y), max(y), 100);
    [Xq, Yq] = meshgrid(Xq, Yq);
    
    % 插值
    F_z1 = scatteredInterpolant([x, y], z_1, 'linear', 'none'); % 使用 'none' 处理 NaN
    Zq_z1 = F_z1(Xq, Yq);
    
    F_z2 = scatteredInterpolant([x, y], z_2, 'linear', 'none');
    Zq_z2 = F_z2(Xq, Yq);
    
    % 平滑处理
    sigma = 1; % 标准差，可根据需要调整
    H = fspecial('gaussian', [5, 5], sigma); % 创建高斯滤波器
    
    % 应用高斯滤波器
    Zq_z1_smooth = conv2(Zq_z1, H, 'same');
    Zq_z2_smooth = conv2(Zq_z2, H, 'same');

    % 处理 NaN 值
    Zq_z1_smooth(isnan(Zq_z1_smooth)) = 0; % 替换 NaN 为 0，可以根据需求调整
    Zq_z2_smooth(isnan(Zq_z2_smooth)) = 0; % 替换 NaN 为 0，可以根据需求调整
end
